package basis.ea;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

/**
 * Die Klasse Datensatz nimmt beim Im- und Export alle Felder eines 
 * Objektes auf. 
 * 
 * Datei: Datensatz.java                   
 * Datum: 28.11.2011   
 *                  
 * @author Alexander Bredo 
 * @version 0.3
 */
public class Datensatz
{
  private HashMap<String, Datenfeld> datenfeldListe = 
      new HashMap<String, Datenfeld> ();
  
  
  /**
   * leerer Konstruktur speziell fuer den Import
   */
  public Datensatz ()
  {
  }
  
  
  /**
   * Konstruktor fuer den Export. Java-Objekt wird als 
   * Datensatz mit Datenfelder abgebildet.
   */
  public Datensatz (Object objekt, Exportdatei ed) 
      throws IOException 
  {
    Object unterobjekt;
    String feldname;
    Field[] variablen = objekt.getClass ().getDeclaredFields ();
    
    try
    {
      for (Field variable : variablen) 
      {
        variable.setAccessible (true);  /* private Zugriffsrechte       */
        unterobjekt = variable.get (objekt);
        feldname = variable.getName ();
        /* Alle Datenfelder des Objektes in Datenfeldliste speichern    */
        datenfeldHinzufuegen (feldname, 
            new Datenfeld (unterobjekt, ed));
      }
    }
    catch (IllegalArgumentException e)
    {
      e.printStackTrace ();
    }
    catch (IllegalAccessException e)
    {
      e.printStackTrace ();
    }
  }

  
  /**
   * Gibt den Wert eines Datenfeldes zurueck
   * @param bezeichnung des Datenfeldes
   * @return Wert des Datenfeldes
   */
  public Datenfeld gibDatenfeld (String bezeichnung)
  {
    return datenfeldListe.get (bezeichnung);
  }
  
  
  /**
   * Fuegt ein neues Datenfeld zur Datensatzliste hinzu
   * @param bezeichnung des Datenfeldes
   * @param wert des Datenfeldes
   */
  public void datenfeldHinzufuegen (String bezeichnung, Datenfeld wert)
  {
    datenfeldListe.put (bezeichnung, wert);
  }
  
  
  /**
   * Loescht ein Datenfeld aus der Datensatzliste
   */
  public void datenfeldLoeschen (String bezeichnung)
  {
    datenfeldListe.remove (bezeichnung);
  }
  
  
  /**
   * Prueft ob ein Datenfeld verfuegbar ist
   */
  public boolean istDatenfeldVorhanden (String bezeichnung)
  {
    return datenfeldListe.containsKey (bezeichnung);
  }
  
  
  /**
   * Gibt die Anzahl der verfuegbaren Datenfelder zurueck
   */
  public int gibAnzahlDatenfelder () 
  {
    return datenfeldListe.size ();
  }
  
  
  /**
   * Gibt den gesamten Datensatz als HashMap (Schluessel + Wert) zurueck
   */
  public HashMap<String, Datenfeld> gibDatensatz () 
  {
    return datenfeldListe;
  }
  
  
  /**
   * Gibt eine Liste aller verfuegbaren Datenfeldnamen als ArrayList 
   * zurueck
   */
  public ArrayList<String> gibDatenfeldListe ()
  {
    ArrayList<String> liste = new ArrayList<String>();
    Set<String> keyliste = datenfeldListe.keySet ();
    Iterator<String> it = keyliste.iterator ();
    
    while (it.hasNext ())
    {
      liste.add (it.next ());
    }
    
    return liste;
  }
  
  
  /**
   * Gibt eine Liste aller verfuegbaren Datenfeldwerte als iterierbare
   * Collection zurueck 
   */
  public Collection<Datenfeld> gibDatenfeldWertliste ()
  {
    return datenfeldListe.values ();
  }
  
}
